//package com.by.service.impl;
//
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.by.bean.CartInfo;
//import com.by.bean.ShopCart;
//import com.by.bean.ShopCartItem;
//import com.by.mapper.ShopCartItemMapper;
//import com.by.service.ShopCartItemService;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
//@Slf4j
//@Service
//public class 无法实时更新商品价格ShopCartItemServiceImpl extends ServiceImpl<ShopCartItemMapper, ShopCartItem> implements ShopCartItemService {
//
//    private static final String CART_KEY_PREFIX = "cart:user:";
//    private static final String SKU_FIELD_PREFIX = "sku:";
//    private static final long CART_EXPIRE_DAYS = 7;
//
//    @Autowired
//    private RedisTemplate<String, Object> redisTemplate;
//
//    @Autowired
//    private ObjectMapper objectMapper;
//
//    // 生成购物车key
//    private String generateCartKey(Long userId) {
//        return CART_KEY_PREFIX + userId;
//    }
//
//    // 生成商品field
//    private String generateSkuField(Long skuId) {
//        return SKU_FIELD_PREFIX + skuId;
//    }
//
//    @Override
//    public int addToCart(ShopCartItem cartItem) {
//        String cartKey = generateCartKey(cartItem.getUserId());
//        String skuField = generateSkuField(cartItem.getSkuId());
//
//        log.info("添加购物车 - 用户ID: {}, SKU ID: {}, 数量: {}",
//            cartItem.getUserId(), cartItem.getSkuId(), cartItem.getCount());
//        log.info("Redis Key: {}, Field: {}", cartKey, skuField);
//
//        try {
//            // 先检查是否已存在
//            ShopCartItem existingItem = (ShopCartItem) redisTemplate.opsForHash().get(cartKey, skuField);
//            if (existingItem != null) {
//                log.info("已存在商品: {}", existingItem);
//                cartItem.setCount(cartItem.getCount() + existingItem.getCount());
//                // 计算总价
//                cartItem.setTotalFee(cartItem.getCount() * cartItem.getPriceFee());
//            }
//
//            // 更新Redis
//            redisTemplate.opsForHash().put(cartKey, skuField, cartItem);
//            redisTemplate.expire(cartKey, CART_EXPIRE_DAYS, TimeUnit.DAYS);
//
//            return 1;
//        } catch (Exception e) {
//            log.error("添加购物车失败", e);
//            throw new RuntimeException("添加购物车失败", e);
//        }
//    }
//
//    @Override
//    public ShopCart getCart(Long userId) {
//        String cartKey = generateCartKey(userId);
//        log.info("获取购物车 - 用户ID: {}, Redis Key: {}", userId, cartKey);
//
//        Map<Object, Object> entries = redisTemplate.opsForHash().entries(cartKey);
//        log.info("Redis查询结果: {}", entries);
//
//        if (entries == null || entries.isEmpty()) {
//            log.info("购物车为空");
//            return null;
//        }
//
//        ShopCart cart = new ShopCart();
//        cart.setUserId(userId);
//        cart.setItems(new ArrayList<>());
//        cart.setTotalAmount(0L);
//
//        for (Map.Entry<Object, Object> entry : entries.entrySet()) {
//            try {
//                log.info("解析购物车项 - Field: {}, Value: {}", entry.getKey(), entry.getValue());
//                ShopCartItem item = (ShopCartItem) entry.getValue();
//                cart.getItems().add(item);
//                cart.setTotalAmount(cart.getTotalAmount() + item.getTotalFee());
//            } catch (Exception e) {
//                log.error("解析购物车项失败", e);
//                throw new RuntimeException("解析购物车项失败", e);
//            }
//        }
//
//        log.info("购物车信息: {}", cart);
//        return cart;
//    }
//
//    @Override
//    public int deleteItem(Long userId, Long skuId) {
//        String cartKey = generateCartKey(userId);
//        String skuField = generateSkuField(skuId);
//        Long deleted = redisTemplate.opsForHash().delete(cartKey, skuField);
//        return deleted != null && deleted > 0 ? 1 : 0;
//    }
//
//    @Override
//    public int updateCartCount(Long userId, Long skuId, int delta) {
//        log.info("更新购物车商品数量 - 用户ID: {}, SKU ID: {}, 变化量: {}", userId, skuId, delta);
//
//        try {
//            String cartKey = generateCartKey(userId);
//            String skuField = generateSkuField(skuId);
//
//            log.info("Redis Key: {}, Field: {}", cartKey, skuField);
//
//            // 先检查商品是否存在
//            ShopCartItem existingItem = (ShopCartItem) redisTemplate.opsForHash().get(cartKey, skuField);
//            if (existingItem == null) {
//                log.warn("购物车中不存在该商品 - 用户ID: {}, SKU ID: {}", userId, skuId);
//                return 0;
//            }
//
//            log.info("当前商品信息: {}", existingItem);
//
//            // 计算新的数量
//            int newCount = existingItem.getCount() + delta;
//
//            // 如果数量小于等于0，则删除商品
//            if (newCount <= 0) {
//                redisTemplate.opsForHash().delete(cartKey, skuField);
//                log.info("商品数量为0，已从购物车删除 - 用户ID: {}, SKU ID: {}", userId, skuId);
//                return 1;
//            }
//
//            // 更新数量并重新计算总价
//            existingItem.setCount(newCount);
//            existingItem.setTotalFee(existingItem.getCount() * existingItem.getPriceFee());
//
//            // 更新Redis
//            redisTemplate.opsForHash().put(cartKey, skuField, existingItem);
//
//            log.info("成功更新购物车商品数量 - 用户ID: {}, SKU ID: {}, 新数量: {}",
//                userId, skuId, existingItem.getCount());
//            return 1;
//
//        } catch (Exception e) {
//            log.error("更新购物车商品数量失败 - 用户ID: {}, SKU ID: {}", userId, skuId, e);
//            return 0;
//        }
//    }
//
//    @Override
//    public int clearCart(Long userId) {
//        String cartKey = generateCartKey(userId);
//        Boolean deleted = redisTemplate.delete(cartKey);
//        return deleted != null && deleted ? 1 : 0;
//    }
//
//    @Override
//    public CartInfo getCartInfo(Long userId) {
//        ShopCart cart = getCart(userId);
//        if (cart == null) {
//            return null;
//        }
//
//        CartInfo cartInfo = new CartInfo();
//        cartInfo.setItems(cart.getItems());
//        cartInfo.setTotalCount(cart.getItems().stream().mapToInt(ShopCartItem::getCount).sum());
//        cartInfo.setTotalAmount(cart.getTotalAmount());
//
//        // 计算已选中商品的总金额
//        long checkedAmount = cart.getItems().stream()
//            .filter(ShopCartItem::isChecked)
//            .mapToLong(ShopCartItem::getTotalFee)
//            .sum();
//        cartInfo.setCheckedAmount(checkedAmount);
//
//        log.info("购物车统计信息: {}", cartInfo);
//        return cartInfo;
//    }
//
//    @Override
//    public void checkItem(Long userId, Long skuId, Boolean checked) {
//        log.info("更新商品选中状态 - 用户ID: {}, SKU ID: {}, 选中状态: {}", userId, skuId, checked);
//
//        try {
//            String cartKey = generateCartKey(userId);
//            String skuField = generateSkuField(skuId);
//
//            // 获取商品信息
//            ShopCartItem existingItem = (ShopCartItem) redisTemplate.opsForHash().get(cartKey, skuField);
//            if (existingItem == null) {
//                log.warn("购物车中不存在该商品 - 用户ID: {}, SKU ID: {}", userId, skuId);
//                return;
//            }
//
//            // 更新选中状态
//            existingItem.setChecked(checked);
//
//            // 更新Redis
//            redisTemplate.opsForHash().put(cartKey, skuField, existingItem);
//
//            log.info("成功更新商品选中状态 - 用户ID: {}, SKU ID: {}, 选中状态: {}",
//                userId, skuId, checked);
//        } catch (Exception e) {
//            log.error("更新商品选中状态失败 - 用户ID: {}, SKU ID: {}", userId, skuId, e);
//            throw new RuntimeException("更新商品选中状态失败", e);
//        }
//    }
//
//    @Override
//    public Integer getCartCount(Long userId) {
//        ShopCart cart = getCart(userId);
//        if (cart == null) {
//            return 0;
//        }
//        return cart.getItems().stream().mapToInt(ShopCartItem::getCount).sum();
//    }
//
//}